package com.file.util;

import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/***
 * 农行流水特殊 unicode 转换工具
 */
public class BankAbcUnicodeConversion {

    private static final Map<String, String> unicodeMap = new HashMap<>();

    static {
        unicodeMap.put("2EA0", "6C11");
        unicodeMap.put("2EF0", "9F99");
        unicodeMap.put("2EC1", "864E");
        unicodeMap.put("2EE2", "9A6C");
        unicodeMap.put("2EDC", "98DE");
        unicodeMap.put("2ED3", "957F");
        unicodeMap.put("2EE3", "9AA8");
        unicodeMap.put("2EF3", "9F9F");
        unicodeMap.put("2EC4", "897F");
        unicodeMap.put("2ED4", "95E8");
        unicodeMap.put("2EE4", "9B3C");
        unicodeMap.put("2EE5", "9C7C");
        unicodeMap.put("2EC5", "89C1");
        unicodeMap.put("2EC6", "89D2");
        unicodeMap.put("2EE6", "9E1F");
        unicodeMap.put("2EE7", "5364");
        unicodeMap.put("2ED8", "9752");
        unicodeMap.put("2EE8", "9EA6");
        unicodeMap.put("2EC9", "8D1D");
        unicodeMap.put("2ED9", "97E6");
        unicodeMap.put("2EE9", "9EC4");
        unicodeMap.put("2EDA", "9875");
        unicodeMap.put("2ECB", "8F66");
        unicodeMap.put("2EDB", "98CE");
        unicodeMap.put("2EEC", "9F50");
        unicodeMap.put("2EDD", "98DF");
        unicodeMap.put("2EEE", "9F7F");
        unicodeMap.put("2E8E", "5140");
        unicodeMap.put("2E9F", "6BCD");
        unicodeMap.put("2F00", "4E00");
        unicodeMap.put("2F01", "4E28");
        unicodeMap.put("2F02", "4E36");
        unicodeMap.put("2F03", "4E3F");
        unicodeMap.put("2F04", "4E59");
        unicodeMap.put("2F05", "4E85");
        unicodeMap.put("2F06", "4E8C");
        unicodeMap.put("2F07", "4EA0");
        unicodeMap.put("2F08", "4EBA");
        unicodeMap.put("2F09", "513F");
        unicodeMap.put("2F0A", "5165");
        unicodeMap.put("2F0B", "516B");
        unicodeMap.put("2F0C", "5182");
        unicodeMap.put("2F0D", "5196");
        unicodeMap.put("2F0E", "51AB");
        unicodeMap.put("2F0F", "51E0");
        unicodeMap.put("2F10", "51F5");
        unicodeMap.put("2F11", "5200");
        unicodeMap.put("2F12", "529B");
        unicodeMap.put("2F13", "52F9");
        unicodeMap.put("2F14", "5315");
        unicodeMap.put("2F15", "531A");
        unicodeMap.put("2F16", "5338");
        unicodeMap.put("2F17", "5341");
        unicodeMap.put("2F18", "535C");
        unicodeMap.put("2F19", "5369");
        unicodeMap.put("2F1A", "5382");
        unicodeMap.put("2F1B", "53B6");
        unicodeMap.put("2F1C", "53C8");
        unicodeMap.put("2F1D", "53E3");
        unicodeMap.put("2F1E", "56D7");
        unicodeMap.put("2F1F", "571F");
        unicodeMap.put("2F20", "58EB");
        unicodeMap.put("2F21", "5902");
        unicodeMap.put("2F22", "590A");
        unicodeMap.put("2F23", "5915");
        unicodeMap.put("2F24", "5927");
        unicodeMap.put("2F25", "5973");
        unicodeMap.put("2F26", "5B50");
        unicodeMap.put("2F27", "5B80");
        unicodeMap.put("2F28", "5BF8");
        unicodeMap.put("2F29", "5C0F");
        unicodeMap.put("2F2A", "5C22");
        unicodeMap.put("2F2B", "5C38");
        unicodeMap.put("2F2C", "5C6E");
        unicodeMap.put("2F2D", "5C71");
        unicodeMap.put("2F2E", "5DDB");
        unicodeMap.put("2F2F", "5DE5");
        unicodeMap.put("2F30", "5DF1");
        unicodeMap.put("2F31", "5DFE");
        unicodeMap.put("2F32", "5E72");
        unicodeMap.put("2F33", "5E7A");
        unicodeMap.put("2F34", "5E7F");
        unicodeMap.put("2F35", "5EF4");
        unicodeMap.put("2F36", "5EFE");
        unicodeMap.put("2F37", "5F0B");
        unicodeMap.put("2F38", "5F13");
        unicodeMap.put("2F39", "5F50");
        unicodeMap.put("2F3A", "5F61");
        unicodeMap.put("2F3B", "5F73");
        unicodeMap.put("2F3C", "5FC3");
        unicodeMap.put("2F3D", "6208");
        unicodeMap.put("2F3E", "6237");
        unicodeMap.put("2F3F", "624B");
        unicodeMap.put("2F40", "652F");
        unicodeMap.put("2F41", "6534");
        unicodeMap.put("2F42", "6587");
        unicodeMap.put("2F43", "6597");
        unicodeMap.put("2F44", "65A4");
        unicodeMap.put("2F45", "65B9");
        unicodeMap.put("2F46", "65E0");
        unicodeMap.put("2F47", "65E5");
        unicodeMap.put("2F48", "66F0");
        unicodeMap.put("2F49", "6708");
        unicodeMap.put("2F4A", "6728");
        unicodeMap.put("2F4B", "6B20");
        unicodeMap.put("2F4C", "6B62");
        unicodeMap.put("2F4D", "6B79");
        unicodeMap.put("2F4E", "6BB3");
        unicodeMap.put("2F4F", "6BCB");
        unicodeMap.put("2F50", "6BD4");
        unicodeMap.put("2F51", "6BDB");
        unicodeMap.put("2F52", "6C0F");
        unicodeMap.put("2F53", "6C14");
        unicodeMap.put("2F54", "6C34");
        unicodeMap.put("2F55", "706B");
        unicodeMap.put("2F56", "722A");
        unicodeMap.put("2F57", "7236");
        unicodeMap.put("2F58", "723B");
        unicodeMap.put("2F59", "723F");
        unicodeMap.put("2F5A", "7247");
        unicodeMap.put("2F5B", "7259");
        unicodeMap.put("2F5C", "725B");
        unicodeMap.put("2F5D", "72AC");
        unicodeMap.put("2F5E", "7384");
        unicodeMap.put("2F5F", "7389");
        unicodeMap.put("2F60", "74DC");
        unicodeMap.put("2F61", "74E6");
        unicodeMap.put("2F62", "7518");
        unicodeMap.put("2F63", "751F");
        unicodeMap.put("2F64", "7528");
        unicodeMap.put("2F65", "7530");
        unicodeMap.put("2F66", "758B");
        unicodeMap.put("2F67", "7592");
        unicodeMap.put("2F68", "7676");
        unicodeMap.put("2F69", "767D");
        unicodeMap.put("2F6A", "76AE");
        unicodeMap.put("2F6B", "76BF");
        unicodeMap.put("2F6C", "76EE");
        unicodeMap.put("2F6D", "77DB");
        unicodeMap.put("2F6E", "77E2");
        unicodeMap.put("2F6F", "77F3");
        unicodeMap.put("2F70", "793A");
        unicodeMap.put("2F71", "79B8");
        unicodeMap.put("2F72", "79BE");
        unicodeMap.put("2F73", "7A74");
        unicodeMap.put("2F74", "7ACB");
        unicodeMap.put("2F75", "7AF9");
        unicodeMap.put("2F76", "7C73");
        unicodeMap.put("2F77", "7CF8");
        unicodeMap.put("2F78", "7F36");
        unicodeMap.put("2F79", "7F51");
        unicodeMap.put("2F7A", "7F8A");
        unicodeMap.put("2F7B", "7FBD");
        unicodeMap.put("2F7C", "8001");
        unicodeMap.put("2F7D", "800C");
        unicodeMap.put("2F7E", "8012");
        unicodeMap.put("2F7F", "8033");
        unicodeMap.put("2F80", "807F");
        unicodeMap.put("2F81", "8089");
        unicodeMap.put("2F82", "81E3");
        unicodeMap.put("2F83", "81EA");
        unicodeMap.put("2F84", "81F3");
        unicodeMap.put("2F85", "81FC");
        unicodeMap.put("2F86", "820C");
        unicodeMap.put("2F87", "821B");
        unicodeMap.put("2F88", "821F");
        unicodeMap.put("2F89", "826E");
        unicodeMap.put("2F8A", "8272");
        unicodeMap.put("2F8B", "8278");
        unicodeMap.put("2F8C", "864D");
        unicodeMap.put("2F8D", "866B");
        unicodeMap.put("2F8E", "8840");
        unicodeMap.put("2F8F", "884C");
        unicodeMap.put("2F90", "8863");
        unicodeMap.put("2F91", "897E");
        unicodeMap.put("2F92", "898B");
        unicodeMap.put("2F93", "89D2");
        unicodeMap.put("2F94", "8A00");
        unicodeMap.put("2F95", "8C37");
        unicodeMap.put("2F96", "8C46");
        unicodeMap.put("2F97", "8C55");
        unicodeMap.put("2F98", "8C78");
        unicodeMap.put("2F99", "8C9D");
        unicodeMap.put("2F9A", "8D64");
        unicodeMap.put("2F9B", "8D70");
        unicodeMap.put("2F9C", "8DB3");
        unicodeMap.put("2F9D", "8EAB");
        unicodeMap.put("2F9E", "8ECA");
        unicodeMap.put("2F9F", "8F9B");
        unicodeMap.put("2FA0", "8FB0");
        unicodeMap.put("2FA1", "8FB5");
        unicodeMap.put("2FA2", "9091");
        unicodeMap.put("2FA3", "9149");
        unicodeMap.put("2FA4", "91C6");
        unicodeMap.put("2FA5", "91CC");
        unicodeMap.put("2FA6", "91D1");
        unicodeMap.put("2FA7", "9577");
        unicodeMap.put("2FA8", "9580");
        unicodeMap.put("2FA9", "961C");
        unicodeMap.put("2FAA", "96B6");
        unicodeMap.put("2FAB", "96B9");
        unicodeMap.put("2FAC", "96E8");
        unicodeMap.put("2FAD", "9751");
        unicodeMap.put("2FAE", "975E");
        unicodeMap.put("2FAF", "9762");
        unicodeMap.put("2FB0", "9769");
        unicodeMap.put("2FB1", "97CB");
        unicodeMap.put("2FB2", "97ED");
        unicodeMap.put("2FB3", "97F3");
        unicodeMap.put("2FB4", "9801");
        unicodeMap.put("2FB5", "98A8");
        unicodeMap.put("2FB6", "98DB");
        unicodeMap.put("2FB7", "98DF");
        unicodeMap.put("2FB8", "9996");
        unicodeMap.put("2FB9", "9999");
        unicodeMap.put("2FBA", "99AC");
        unicodeMap.put("2FBB", "9AA8");
        unicodeMap.put("2FBC", "9AD8");
        unicodeMap.put("2FBD", "9ADF");
        unicodeMap.put("2FBE", "9B25");
        unicodeMap.put("2FBF", "9B2F");
        unicodeMap.put("2FC0", "9B32");
        unicodeMap.put("2FC1", "9B3C");
        unicodeMap.put("2FC2", "9B5A");
        unicodeMap.put("2FC3", "9CE5");
        unicodeMap.put("2FC4", "9E75");
        unicodeMap.put("2FC5", "9E7F");
        unicodeMap.put("2FC6", "9EA5");
        unicodeMap.put("2FC7", "9EBB");
        unicodeMap.put("2FC8", "9EC3");
        unicodeMap.put("2FC9", "9ECD");
        unicodeMap.put("2FCA", "9ED1");
        unicodeMap.put("2FCB", "9EF9");
        unicodeMap.put("2FCC", "9EFD");
        unicodeMap.put("2FCD", "9F0E");
        unicodeMap.put("2FCE", "9F13");
        unicodeMap.put("2FCF", "9F20");
        unicodeMap.put("2FD0", "9F3B");
        unicodeMap.put("2FD1", "9F4A");
        unicodeMap.put("2FD2", "9F52");
        unicodeMap.put("2FD3", "9F8D");
        unicodeMap.put("2FD4", "9F9C");
        unicodeMap.put("2FD5", "9FA0");
        unicodeMap.put("9EC3", "9EC4");
    }

    public static String replaceSpecialUnicode(String text) {
        if (StringUtils.isBlank(text)) {
            return text;
        }
        IntStream result = text.chars();
        text = result.map(c -> getUnicodeValue((char) c)).mapToObj(i -> Character.toString((char) i)).collect(Collectors.joining());
        return text;
    }

    private static char getUnicodeValue(char value) {
        String unicode = Integer.toHexString(value).toUpperCase();
        if (unicodeMap.containsKey(unicode)) {
            unicode = unicodeMap.get(unicode);
            value = (char) Integer.parseInt(unicode, 16);
        }
        return value;
    }

    public static void main(String[] args) {
        String text = "⽩⽨⽧⽦⻝⽥⻜⽤⻛⽣⻚⽢⽪⻘⽟⽞⻔⽝⻓⽜⽛⽚⽡⽠⻙⽹⽸⽷⻮⽶⽵⻬⽴⽳⽻⽺⻰⻩⻨⻧⻦⽯⻥⽮⻤⽭⻣⽬⻢⽫⽲⽱⽰⾉⾈⾇⾆⾅⾄⾌⾋⾊⽿⽾⽽⻳⽼⾃⾂⾁⾀⾙⾘⾗⾖黃⾕⾝⾜⾛⾚⾏⾎⾍⾔⾓⾒⾑⾐⾟⾞⺎⺟⼃⼂⼁⼀⼉⼈⼇⼆⼅⼄⼔⾭⼓⾬⼒⾫⼑⾪⼐⼙⼘⼗⼖⾯⼕⾮⼌⾤⼋⾣⼊⾢⾡⾠⾩⾨⼏⾧⼎⾦⼍⾥⼥⾾⼤⾽⼣⾼⼢⾻⼡⾺⼠⼩⼨⼧⼦⾿⼝⾵⼜⾴⼛⾳⼚⾲⾱⾰⾹⾸⼟⾷⼞⾶⼶⿏⼵⿎⼴⿍⼳⿌⼲⿋⼱⿊⼰⼹⼸⼷⼮⿆⼭⿅⼬⿄⼫⿃⼪⿂⺠⿁⿀⿉⿈⼯⿇⽇⽆⽅⽄⽃⽂⽁⽀⽉⽈⼿⼾⼽⿕⼼⿔⼻⿓⼺⿒⿑⿐⽘⽗⽖⽕⽔⻋⽓⽒⽑⽙⻆⽏⻅⽎⻄⽍⽌⽋⻁⽊⽐⻉";
        System.out.println(replaceSpecialUnicode(text));
    }
}


